package com.zhxy.vo;

/**
 * 上传策略数据是资源上传时附带的一组配置设定。通过这组配置信息，网宿云存储可以了解用户上传的需求：它将上传什么资源，上传到哪个空间，上传结果是回调通知还是使用重定向跳转，是否需要设置反馈信息的内容，以及授权上传的截止时间等等。
 * @see https://wcs.chinanetcenter.com/document/API/Token/UploadToken
 * 
 * @author XnOU
 */
public class PutPolicy implements java.io.Serializable {

    private static final long serialVersionUID = 2149236362571116154L;

    /**
     * 指定上传的目标空间<bucket>和文件名<key>，有两种格式：
     * a.<bucket>表示上传文件到指定的bucket；
     * b.<bucket>:<key>上传文件到指定的bucket，文件命名为key。当overwrite为1时，已存在同名资源则会被覆盖。
     */
    private String scope;
    /**
     * 上传请求授权的截止时间；UNIX时间戳，单位：毫秒。范例：1398916800000，代表时间2014-05-01 12:00:00。
     */
    private String deadline;

    /**
     * 自定义资源名。
     * 支持特殊替换变量、自定义变量及常量。该字段仅支持普通上传方式
     */
    private String saveKey;

    /**
     * 限定上传文件的大小，单位：字节(Byte)。超过限制的上传内容会被判为上传失败，返回401状态码。
     */
    private long fsizeLimit;

    /**
     * 指定是否覆盖服务器上已经存在的文件<br />
     * 1-允许覆盖, 0-不允许
     */
    private int overwrite;

    /**
     * Web端文件上传成功或失败后，浏览器都会执行303跳转的URL，通常用于HTML
     * Form上传。如果文件上传成功，则会跳转到<returnUrl>?upload_ret=<queryString>，其中<queryString>包含returnBody内容。如果文件上传失败，则会跳转到<returnUrl>?code=
     * <code>&message=<message>，其中<code>是错误码，<message>是错误具体信息。如不设置returnUrl，则直接将returnBody的内容返回给客户端。
     */
    private String returnUrl;

    /**
     * 上传成功后，自定义最终返回給上传端的数据（该字段配合returnUrl使用）。如果您只需要返回文件大小和文件地址，只需将returnBody设置成fname=$(fname)&fsize=$(fsize)&url=$(url)即可。详细用法参返回数据说明。
     */
    private String returnBody;

    /**
     * 上传成功后，云存储以POST方式请求该地址。（要求:必须是公网URL地址，能正常响应HTTP/1.1 200 OK，若有空格等特殊字符，需要进行Url Encode编码）该地址响应数据格式为JSON文本。
     */
    private String callbackUrl;

    /**
     * 上传成功后，网宿云POST方式提交到callbackUrl的数据。callbackBody 要求是合法的url query string，如：key=$(key)&fsize=$(fsize)，详细用法参考回调方式数据说明
     */
    private String callbackBody;

    /**
     * 接收预处理结果通知的地址，要求必须是公网URL地址，能正常响应HTTP/1.1 200 OK，若有空格等特殊字符，需要进行Url Encode编码。通知内容详见通知数据内容说明
     */
    private String persistentNotifyUrl;

    /**
     * 文件上传成功后，预处理指令列表。每个指令是一个API规格字符串，多个指令用;分隔。请参看指令说明。
     */
    private String persistentOps;

    /**
     * 转码是否分开通知。设置1和0作为选项码：
     * 1：表示每个转码指令执行完后都通知persistentNotifyUrl
     * 0：表示所有转码指令执行完后再一次性通知persistentNotifyUrl
     * 默认值为0
     */
    private int separate;

    public String getScope() {
        return scope;
    }

    public void setScope(String scope) {
        this.scope = scope;
    }

    public String getDeadline() {
        return deadline;
    }

    public void setDeadline(String deadline) {
        this.deadline = deadline;
    }

    public String getSaveKey() {
        return saveKey;
    }

    public void setSaveKey(String saveKey) {
        this.saveKey = saveKey;
    }

    public long getFsizeLimit() {
        return fsizeLimit;
    }

    public void setFsizeLimit(long fsizeLimit) {
        this.fsizeLimit = fsizeLimit;
    }

    public int getOverwrite() {
        return overwrite;
    }

    public void setOverwrite(int overwrite) {
        this.overwrite = overwrite;
    }

    public String getReturnUrl() {
        return returnUrl;
    }

    public void setReturnUrl(String returnUrl) {
        this.returnUrl = returnUrl;
    }

    public String getReturnBody() {
        return returnBody;
    }

    public void setReturnBody(String returnBody) {
        this.returnBody = returnBody;
    }

    public String getCallbackUrl() {
        return callbackUrl;
    }

    public void setCallbackUrl(String callbackUrl) {
        this.callbackUrl = callbackUrl;
    }

    public String getCallbackBody() {
        return callbackBody;
    }

    public void setCallbackBody(String callbackBody) {
        this.callbackBody = callbackBody;
    }

    public String getPersistentNotifyUrl() {
        return persistentNotifyUrl;
    }

    public void setPersistentNotifyUrl(String persistentNotifyUrl) {
        this.persistentNotifyUrl = persistentNotifyUrl;
    }

    public String getPersistentOps() {
        return persistentOps;
    }

    public void setPersistentOps(String persistentOps) {
        this.persistentOps = persistentOps;
    }

    public int getSeparate() {
        return separate;
    }

    public void setSeparate(int separate) {
        this.separate = separate;
    }

    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + ((callbackBody == null) ? 0 : callbackBody.hashCode());
        result = prime * result + ((callbackUrl == null) ? 0 : callbackUrl.hashCode());
        result = prime * result + ((deadline == null) ? 0 : deadline.hashCode());
        result = prime * result + (int) (fsizeLimit ^ (fsizeLimit >>> 32));
        result = prime * result + overwrite;
        result = prime * result + ((persistentNotifyUrl == null) ? 0 : persistentNotifyUrl.hashCode());
        result = prime * result + ((persistentOps == null) ? 0 : persistentOps.hashCode());
        result = prime * result + ((returnBody == null) ? 0 : returnBody.hashCode());
        result = prime * result + ((returnUrl == null) ? 0 : returnUrl.hashCode());
        result = prime * result + ((saveKey == null) ? 0 : saveKey.hashCode());
        result = prime * result + ((scope == null) ? 0 : scope.hashCode());
        result = prime * result + separate;
        return result;
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        PutPolicy other = (PutPolicy) obj;
        if (callbackBody == null) {
            if (other.callbackBody != null)
                return false;
        } else if (!callbackBody.equals(other.callbackBody))
            return false;
        if (callbackUrl == null) {
            if (other.callbackUrl != null)
                return false;
        } else if (!callbackUrl.equals(other.callbackUrl))
            return false;
        if (deadline == null) {
            if (other.deadline != null)
                return false;
        } else if (!deadline.equals(other.deadline))
            return false;
        if (fsizeLimit != other.fsizeLimit)
            return false;
        if (overwrite != other.overwrite)
            return false;
        if (persistentNotifyUrl == null) {
            if (other.persistentNotifyUrl != null)
                return false;
        } else if (!persistentNotifyUrl.equals(other.persistentNotifyUrl))
            return false;
        if (persistentOps == null) {
            if (other.persistentOps != null)
                return false;
        } else if (!persistentOps.equals(other.persistentOps))
            return false;
        if (returnBody == null) {
            if (other.returnBody != null)
                return false;
        } else if (!returnBody.equals(other.returnBody))
            return false;
        if (returnUrl == null) {
            if (other.returnUrl != null)
                return false;
        } else if (!returnUrl.equals(other.returnUrl))
            return false;
        if (saveKey == null) {
            if (other.saveKey != null)
                return false;
        } else if (!saveKey.equals(other.saveKey))
            return false;
        if (scope == null) {
            if (other.scope != null)
                return false;
        } else if (!scope.equals(other.scope))
            return false;
        if (separate != other.separate)
            return false;
        return true;
    }

    @Override
    public String toString() {
        return "PutPolicy [scope=" + scope + ", deadline=" + deadline + ", saveKey=" + saveKey + ", fsizeLimit="
                + fsizeLimit + ", overwrite=" + overwrite + ", returnUrl=" + returnUrl + ", returnBody=" + returnBody
                + ", callbackUrl=" + callbackUrl + ", callbackBody=" + callbackBody + ", persistentNotifyUrl="
                + persistentNotifyUrl + ", persistentOps=" + persistentOps + ", separate=" + separate + "]";
    }

}
